/*
 * Game.h
 *
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses 
 */

#ifndef GAME_H_
#define GAME_H_

#include <vector>
#include <map>
#include "Map.h"
#include "GameController.h"
#include "Partida.h"
#include "Nivel.h"
#include "Constantes.h"
#include "Bomberman.h"
#include "SharedConstants.h"
#include "MapStateObserver.h"

// Clase que modela el juego actual de una partida

class Game {
private:
    Map* map;
    GameController* game_controller;
    Partida& game_room;
    Nivel& level;
    std::map<int, Bomberman*> bombermans;
    std::vector<ModelObject> bomberman_representations;
    MapStateObserver* map_observer;

public:
    Game(Partida& game_room, Nivel& level);
    // Prepara el nivel para jugarlo. Carga el mapa y el controlador con el
    // estado inicial correspondiente al nivel, asigna un bomberman a cada
    // jugador de la partida, y carga los Observers necesarios
    void loadLevel();
    GameState getState();
    // Indica que el bomberman del jugador con el id dado intentó moverse.
    // Devuelve true si el movimiento puede efectuarse, false en caso contrario
    bool moveUp(int player_id);
    bool moveRight(int player_id);
    bool moveDown(int player_id);
    bool moveLeft(int player_id);
    // Indica que el bomberman del jugador con el id dado intentó plantar una
    // bomba. Devuelve true si puede hacerse, false en caso contrario
    bool plantBomb(int player_id);
    bool isRunning();
    // Inicia el juego, iniciando el controlador
    void startGame();
    // Detiene el juego
    void stopGame();
    ~Game();
private:
    // Crea y carga los Observer
    void setUpObservers();
    bool moveBomberman(int player_id, int dx, int dy);
    // Carga las distintas representaciones de los bomberman, para poder
    // asignar una diferente a cada uno
    void load_representations();
};

#endif /* GAME_H_ */
